Return to start page

Systems/Character/Struct Movement.j

Code

		
1			/// The rtc.j file is required.
2 /// Jumping is not implemented yet.
3 /// Do not use this library, it is unfinished!
4 library AStructSystemsCharacterMovement requires optional ALibraryCoreDebugMisc, AStructCoreGeneralAsl, AStructCoreGeneralHashTable, ALibraryCoreInterfaceMisc, AStructSystemsCharacterAbstractCharacterSystem
5
6 //Die Blocker-Suche noch weiter ausarbeiten und auch die Entfernung für die Kamera damit berechnen
7 //Herausfinden wir man Parameter in die Funktion der Blocker übergeben kann.
8 //private function FilterFunctionIsDestructableBlocker takes nothing returns boolean
9 //local destructable FilterDestructable = GetFilterDestructable()
10 //local boolean Result = false
11 //if (GetDestructableTypeId(FilterDestructable) == 'YTpb') then //Verlauf-Blocker Boden
12 //set Result = true
13 //elseif (GetDestructableTypeId(FilterDestructable) == 'YTpc') then //Verlauf-Blocker Boden (groß)
14 //set Result = true
15 //elseif (GetDestructableTypeId(FilterDestructable) == 'YTfb') then //Verlauf-Blocker Beides (groß)
16 //set Result = true
17 //elseif (GetDestructableTypeId(FilterDestructable) == 'YTfc') then //Verlauf-Blocker Beides
18 //set Result = true
19 //endif
20 //set FilterDestructable = null
21 //return Result
22 //endfunction
23
24 //function IsBlockerInRange takes real X, real Y, real Angle, real AngleWidth, real Distance returns boolean
25 //local real RealAngle = (AngleWidth / 2.00)
26 //local real X1 = GetPolarProjectionX(X, (Angle + RealAngle), 0.00)
27 //local real Y1 = GetPolarProjectionY(Y, (Angle + RealAngle), 0.00)
28 //local real X2 = GetPolarProjectionX(X, (Angle - RealAngle), Distance)
29 //local real Y2 = GetPolarProjectionY(Y, (Angle - RealAngle), Distance)
30 //local rect BlockerRect = Rect(X1, Y1, X2, Y2)
31 //call EnumDestructablesInRect(BlockerRect, Filter(function FilterFunctionIsDestructableBlocker), null)
32 //call RemoveRect(BlockerRect)
33 //set BlockerRect = null
34 //return false
35 //endfunction
36
37 struct AMovement extends AAbstractCharacterSystem
38 //static constant members
39 private static constant integer stateMoveForward = 0
40 private static constant integer stateMoveBackward = 1
41 private static constant integer stateTurnRight = 2
42 private static constant integer stateTurnLeft = 3
43 private static constant integer maxStates = 4
44 private static constant integer maxMovementTriggers = 8
45 //static start members
46 static if (A_RTC and A_FPS_MOVEMENT) then
47 private static integer fpsKeyMoveForward
48 private static integer fpsKeyMoveBackward
49 private static integer fpsKeyTurnRight
50 private static integer fpsKeyTurnLeft
51 endif
52 private static real refreshRate
53 private static real speed
54 private static real angle
55 private static boolean stopWhileStanding
56 //members
57 private trigger m_movementTrigger
58 static if (A_RTC and A_FPS_MOVEMENT) then
59 private trigger m_fpsTriggerUp
60 private trigger m_fpsTriggerDown
61 else
62 private trigger array m_startMovementTrigger[thistype.maxMovementTriggers]
63 endif
64 private boolean array m_state[thistype.maxStates]
65
66 //! runtextmacro optional A_STRUCT_DEBUG("\"AMovement\"")
67
68 public method enable takes nothing returns nothing
69 local integer i
70 call super.enable()
71 call EnableTrigger(this.m_movementTrigger)
72 set i = 0
73 loop
74 exitwhen(i == thistype.maxMovementTriggers)
75 call EnableTrigger(this.m_startMovementTrigger[i])
76 set i = i + 1
77 endloop
78 endmethod
79
80 public method disable takes nothing returns nothing
81 local integer i
82 call super.disable()
83 call DisableTrigger(this.m_movementTrigger)
84 set i = 0
85 loop
86 exitwhen(i == thistype.maxMovementTriggers)
87 call DisableTrigger(this.m_startMovementTrigger[i])
88 set i = i + 1
89 endloop
90 endmethod
91
92 private method moveToPoint takes real x, real y returns nothing
93 if (not IsTerrainPathable(x, y, PATHING_TYPE_WALKABILITY)) then
94 call this.character().setPosition(x, y)
95 endif
96 endmethod
97
98 private method moveForward takes nothing returns nothing
99 local real facing = GetUnitFacing(this.unit())
100 local real x = GetUnitX(this.unit())
101 local real y = GetUnitY(this.unit())
102 set x = x + thistype.speed * Cos(facing * bj_DEGTORAD)
103 set y = y + thistype.speed * Sin(facing * bj_DEGTORAD)
104 call this.moveToPoint(x, y)
105 debug call Print("move forward")
106 endmethod
107
108 private method moveBackward takes nothing returns nothing
109 local real facing = GetUnitFacing(this.unit())
110 local real x = GetUnitX(this.unit())
111 local real y = GetUnitY(this.unit())
112 set x = x - thistype.speed * Cos(facing * bj_DEGTORAD)
113 set y = y - thistype.speed * Sin(facing * bj_DEGTORAD)
114 call this.moveToPoint(x, y)
115 debug call Print("move backward")
116 endmethod
117
118 private method moveRightForward takes nothing returns nothing
119 local real facing = GetUnitFacing(this.unit())
120 local real x = GetUnitX(this.unit())
121 local real y = GetUnitY(this.unit())
122 set x = x + thistype.speed * Cos((facing - thistype.angle) * bj_DEGTORAD)
123 set y = y + thistype.speed * Sin((facing - thistype.angle) * bj_DEGTORAD)
124 call this.moveToPoint(x, y)
125 endmethod
126
127 private method moveRightBackward takes nothing returns nothing
128 local real facing = GetUnitFacing(this.unit())
129 local real x = GetUnitX(this.unit())
130 local real y = GetUnitY(this.unit())
131 set x = x - thistype.speed * Cos((facing + thistype.angle) * bj_DEGTORAD)
132 set y = y - thistype.speed * Sin((facing + thistype.angle) * bj_DEGTORAD)
133 call this.moveToPoint(x, y)
134 endmethod
135
136 private method moveLeftForward takes nothing returns nothing
137 local real facing = GetUnitFacing(this.unit())
138 local real x = GetUnitX(this.unit())
139 local real y = GetUnitY(this.unit())
140 set x = x + thistype.speed * Cos((facing + thistype.angle) * bj_DEGTORAD)
141 set y = y + thistype.speed * Sin((facing + thistype.angle) * bj_DEGTORAD)
142 call this.moveToPoint(x, y)
143 endmethod
144
145 private method moveLeftBackward takes nothing returns nothing
146 local real facing = GetUnitFacing(this.unit())
147 local real x = GetUnitX(this.unit())
148 local real y = GetUnitY(this.unit())
149 set x = x - thistype.speed * Cos((facing - thistype.angle) * bj_DEGTORAD)
150 set y = y - thistype.speed * Sin((facing - thistype.angle) * bj_DEGTORAD)
151 call this.moveToPoint(x, y)
152 endmethod
153
154 private method turnRight takes nothing returns nothing
155 local real facingAngle = GetUnitFacing(this.unit()) - thistype.angle
156 call SetUnitFacingTimed(this.unit(), facingAngle, thistype.refreshRate + 0.5)
157 endmethod
158
159 private method turnLeft takes nothing returns nothing
160 local real facingAngle = GetUnitFacing(this.unit()) + thistype.angle
161 call SetUnitFacingTimed(this.unit(), facingAngle, thistype.refreshRate + 0.5)
162 endmethod
163
164 private method stop takes nothing returns nothing
165 call IssueImmediateOrder(this.unit(), "holdposition")
166 endmethod
167
168 private static method triggerConditionIsAlive takes nothing returns boolean
169 local trigger triggeringTrigger = GetTriggeringTrigger()
170 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
171 local boolean result = not IsUnitDeadBJ(this.unit())
172 set triggeringTrigger = null
173 return result
174 endmethod
175
176 private static method triggerActionMovement takes nothing returns nothing
177 local trigger triggeringTrigger = GetTriggeringTrigger()
178 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
179 if (this.m_state[thistype.stateMoveForward]) then
180 if (this.m_state[thistype.stateTurnRight]) then
181 call this.moveRightForward()
182 elseif (this.m_state[thistype.stateTurnLeft]) then
183 call this.moveLeftForward()
184 else
185 call this.moveForward()
186 endif
187 elseif (this.m_state[thistype.stateMoveBackward]) then
188 if (this.m_state[thistype.stateTurnRight]) then
189 call this.moveRightBackward()
190 elseif (this.m_state[thistype.stateTurnLeft]) then
191 call this.moveLeftBackward()
192 else
193 call this.moveBackward()
194 endif
195 elseif (this.m_state[thistype.stateTurnRight]) then
196 call this.turnRight()
197 elseif (this.m_state[thistype.stateTurnLeft]) then
198 call this.turnLeft()
199 elseif (thistype.stopWhileStanding) then
200 call this.stop()
201 endif //Stop wird in den Start-Aktionen aufgerufen
202 set triggeringTrigger = null
203 endmethod
204 //static if (not A_RTC or not A_FPS_MOVEMENT) then
205 static if (not A_FPS_MOVEMENT) then
206 private static method triggerActionMoveForward takes nothing returns nothing
207 local trigger triggeringTrigger = GetTriggeringTrigger()
208 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
209 set this.m_state[thistype.stateMoveBackward] = false
210 set this.m_state[thistype.stateMoveForward] = true
211 set triggeringTrigger = null
212 endmethod
213
214 private static method triggerActionStopMovingForward takes nothing returns nothing
215 local trigger triggeringTrigger = GetTriggeringTrigger()
216 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
217 set this.m_state[thistype.stateMoveForward] = false
218 set triggeringTrigger = null
219 endmethod
220
221 private static method triggerActionMoveBackward takes nothing returns nothing
222 local trigger triggeringTrigger = GetTriggeringTrigger()
223 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
224 set this.m_state[thistype.stateMoveForward] = false
225 set this.m_state[thistype.stateMoveBackward] = true
226 set triggeringTrigger = null
227 endmethod
228
229 private static method triggerActionStopMovingBackward takes nothing returns nothing
230 local trigger triggeringTrigger = GetTriggeringTrigger()
231 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
232 set this.m_state[thistype.stateMoveBackward] = false
233 set triggeringTrigger = null
234 endmethod
235
236 private static method triggerActionTurnRight takes nothing returns nothing
237 local trigger triggeringTrigger = GetTriggeringTrigger()
238 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
239 set this.m_state[thistype.stateTurnLeft] = false
240 set this.m_state[thistype.stateTurnRight] = true
241 set triggeringTrigger = null
242 endmethod
243
244 private static method triggerActionStopTurningRight takes nothing returns nothing
245 local trigger triggeringTrigger = GetTriggeringTrigger()
246 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
247 set this.m_state[thistype.stateTurnRight] = false
248 set triggeringTrigger = null
249 endmethod
250
251 private static method triggerActionTurnLeft takes nothing returns nothing
252 local trigger triggeringTrigger = GetTriggeringTrigger()
253 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
254 set this.m_state[thistype.stateTurnRight] = false
255 set this.m_state[thistype.stateTurnLeft] = true
256 set triggeringTrigger = null
257 endmethod
258
259 private static method triggerActionStopTurningLeft takes nothing returns nothing
260 local trigger triggeringTrigger = GetTriggeringTrigger()
261 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
262 set this.m_state[thistype.stateTurnLeft] = false
263 set triggeringTrigger = null
264 endmethod
265 endif
266 private method createMovementTriggers takes nothing returns nothing
267 local event triggerEvent
268 local conditionfunc conditionFunction
269 local triggercondition triggerCondition
270 local triggeraction triggerAction
271 set this.m_movementTrigger = CreateTrigger()
272 set triggerEvent = TriggerRegisterTimerEvent(this.m_movementTrigger, thistype.refreshRate, true)
273 set conditionFunction = Condition(function thistype.triggerConditionIsAlive)
274 set triggerCondition = TriggerAddCondition(this.m_movementTrigger, conditionFunction)
275 set triggerAction = TriggerAddAction(this.m_movementTrigger, function thistype.triggerActionMovement)
276 call AHashTable.global().setHandleInteger(this.m_movementTrigger, "this", this)
277 set triggerEvent = null
278 set conditionFunction = null
279 set triggerCondition = null
280 set triggerAction = null
281 //static if (not A_RTC or not A_FPS_MOVEMENT) then
282 static if (not A_FPS_MOVEMENT) then
283 //forward
284 set this.m_startMovementTrigger[0] = CreateTrigger()
285 set triggerEvent = TriggerRegisterKeyEventForPlayer(this.user(), this.m_startMovementTrigger[0], AKeyUp, true)
286 set triggerAction = TriggerAddAction(this.m_startMovementTrigger[0], function thistype.triggerActionMoveForward)
287 call AHashTable.global().setHandleInteger(this.m_startMovementTrigger[0], "this", this)
288 set triggerEvent = null
289 set triggerAction = null
290
291 //stop forward
292 set this.m_startMovementTrigger[1] = CreateTrigger()
293 set triggerEvent = TriggerRegisterKeyEventForPlayer(this.user(), this.m_startMovementTrigger[1], AKeyUp, false)
294 set triggerAction = TriggerAddAction(this.m_startMovementTrigger[1], function thistype.triggerActionStopMovingForward)
295 call AHashTable.global().setHandleInteger(this.m_startMovementTrigger[1], "this", this)
296 set triggerEvent = null
297 set triggerAction = null
298
299 //backward
300 set this.m_startMovementTrigger[2] = CreateTrigger()
301 set triggerEvent = TriggerRegisterKeyEventForPlayer(this.user(), this.m_startMovementTrigger[2], AKeyDown, true)
302 set triggerAction = TriggerAddAction(this.m_startMovementTrigger[2], function thistype.triggerActionMoveBackward)
303 call AHashTable.global().setHandleInteger(this.m_startMovementTrigger[2], "this", this)
304 set triggerEvent = null
305 set triggerAction = null
306
307 //stop backward
308 set this.m_startMovementTrigger[3] = CreateTrigger()
309 set triggerEvent = TriggerRegisterKeyEventForPlayer(this.user(), this.m_startMovementTrigger[3], AKeyDown, false)
310 set triggerAction = TriggerAddAction(this.m_startMovementTrigger[3], function thistype.triggerActionStopMovingBackward)
311 call AHashTable.global().setHandleInteger(this.m_startMovementTrigger[3], "this", this)
312 set triggerEvent = null
313 set triggerAction = null
314
315 //right
316 set this.m_startMovementTrigger[4] = CreateTrigger()
317 set triggerEvent = TriggerRegisterKeyEventForPlayer(this.user(), this.m_startMovementTrigger[4], AKeyRight, true)
318 set triggerAction = TriggerAddAction(this.m_startMovementTrigger[4], function thistype.triggerActionTurnRight)
319 call AHashTable.global().setHandleInteger(this.m_startMovementTrigger[4], "this", this)
320 set triggerEvent = null
321 set triggerAction = null
322
323 //stop right
324 set this.m_startMovementTrigger[5] = CreateTrigger()
325 set triggerEvent = TriggerRegisterKeyEventForPlayer(this.user(), this.m_startMovementTrigger[5], AKeyRight, false)
326 set triggerAction = TriggerAddAction(this.m_startMovementTrigger[5], function thistype.triggerActionStopTurningRight)
327 call AHashTable.global().setHandleInteger(this.m_startMovementTrigger[5], "this", this)
328 set triggerEvent = null
329 set triggerAction = null
330
331 //left
332 set this.m_startMovementTrigger[6] = CreateTrigger()
333 set triggerEvent = TriggerRegisterKeyEventForPlayer(this.user(), this.m_startMovementTrigger[6], AKeyLeft, true)
334 set triggerAction = TriggerAddAction(this.m_startMovementTrigger[6], function thistype.triggerActionTurnLeft)
335 call AHashTable.global().setHandleInteger(this.m_startMovementTrigger[6], "this", this)
336 set triggerEvent = null
337 set triggerAction = null
338
339 //stop left
340 set this.m_startMovementTrigger[7] = CreateTrigger()
341 set triggerEvent = TriggerRegisterKeyEventForPlayer(this.user(), this.m_startMovementTrigger[7], AKeyLeft, false)
342 set triggerAction = TriggerAddAction(this.m_startMovementTrigger[7], function thistype.triggerActionStopTurningLeft)
343 call AHashTable.global().setHandleInteger(this.m_startMovementTrigger[7], "this", this)
344 set triggerEvent = null
345 set triggerAction = null
346 endif
347 endmethod
348 static if (A_RTC and A_FPS_MOVEMENT) then
349 private static method triggerActionFpsUp takes nothing returns nothing
350 local trigger triggeringTrigger = GetTriggeringTrigger()
351 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
352 local integer triggerKey = GetTriggerKey() //rtc.j
353 if(triggerKey == thistype.fpsKeyMoveForward) then
354 set this.m_state[thistype.stateMoveForward] = false
355 endif
356 if(triggerKey == thistype.fpsKeyMoveBackward) then
357 set this.m_state[thistype.stateMoveBackward] = false
358 endif
359 if(triggerKey == thistype.fpsKeyTurnRight) then
360 set this.m_state[thistype.stateTurnRight] = false
361 endif
362 if(triggerKey == thistype.fpsKeyTurnLeft) then
363 set this.m_state[thistype.stateTurnLeft] = false
364 endif
365 set triggeringTrigger = null
366 endmethod
367
368 private method createFpsTriggerUp takes nothing returns nothing
369 local triggeraction triggerAction
370 set this.m_fpsTriggerUp = CreateTrigger()
371 call TriggerRegisterKeyEvent(this.m_fpsTriggerUp, 0) //rtc.j
372 set triggerAction = TriggerAddAction(this.m_fpsTriggerUp, function thistype.triggerActionFpsUp)
373 call AHashTable.global().setHandleInteger(this.m_fpsTriggerUp, "this", this)
374 set triggerAction = null
375 endmethod
376
377 private static method triggerActionFpsDown takes nothing returns nothing
378 local trigger triggeringTrigger = GetTriggeringTrigger()
379 local thistype this = AHashTable.global().handleInteger(triggeringTrigger, "this")
380 local integer triggerKey = GetTriggerKey() //rtc.j
381 if(triggerKey == thistype.fpsKeyMoveForward) then
382 set this.m_state[thistype.stateMoveForward] = true
383 endif
384 if(triggerKey == thistype.fpsKeyMoveBackward) then
385 set this.m_state[thistype.stateMoveBackward] = true
386 endif
387 if(triggerKey == thistype.fpsKeyTurnRight) then
388 set this.m_state[thistype.stateTurnRight] = true
389 endif
390 if(triggerKey == thistype.fpsKeyTurnLeft) then
391 set this.m_state[thistype.stateTurnLeft] = true
392 endif
393 set triggeringTrigger = null
394 endmethod
395
396 private method createFpsTriggerDown takes nothing returns nothing
397 local triggeraction triggerAction
398 set this.fpsTriggerDown = CreateTrigger()
399 call TriggerRegisterKeyEvent(this.m_fpsTriggerDown, 1) //rtc.j
400 set triggerAction = TriggerAddAction(this.m_fpsTriggerDown, function thistype.triggerActionFpsDown)
401 call AHashTable.global().setHandleInteger(this.m_fpsTriggerDown, "this", this)
402 set triggerAction = null
403 endmethod
404 endif
405
406 public static method create takes ACharacter character returns thistype
407 local thistype this = thistype.allocate(character)
408
409 call this.createMovementTriggers()
410 static if (A_RTC and A_FPS_MOVEMENT) then
411 call this.createFpsTriggerUp()
412 call this.createFpsTriggerDown()
413 endif
414 return this
415 endmethod
416
417 private method destroyKeyMovementTriggers takes nothing returns nothing
418 //static if (not A_RTC or not A_FPS_MOVEMENT) then
419 static if (not A_FPS_MOVEMENT) then
420 local integer i
421 endif
422 call AHashTable.global().destroyTrigger(this.m_movementTrigger)
423 set this.m_movementTrigger = null
424 //static if (not A_RTC or not A_FPS_MOVEMENT) then
425 static if (not A_FPS_MOVEMENT) then
426 set i = 0
427 loop
428 exitwhen(i == thistype.maxMovementTriggers)
429 call AHashTable.global().destroyTrigger(this.m_startMovementTrigger[i])
430 set this.m_startMovementTrigger[i] = null
431 set i = i + 1
432 endloop
433 endif
434 endmethod
435 static if (A_RTC and A_FPS_MOVEMENT) then
436 private method destroyFpsTriggerUp takes nothing returns nothing
437 call AHashTable.global().destroyTrigger(this.m_fpsTriggerUp)
438 set this.fpsTriggerUp = null
439 endmethod
440
441 private method destroyFpsTriggerDown takes nothing returns nothing
442 call AHashTable.global().destroyTrigger(this.m_fpsTriggerDown)
443 set this.fpsTriggerDown = null
444 endmethod
445 endif
446 public method onDestroy takes nothing returns nothing
447
448 call this.destroyKeyMovementTriggers()
449 static if (A_RTC and A_FPS_MOVEMENT) then
450 call this.destroyFpsTriggerUp()
451 call this.destroyFpsTriggerDown()
452 endif
453 endmethod
454 //static if (not A_RTC or not A_FPS_MOVEMENT) then
455 static if (not A_FPS_MOVEMENT) then
456 /**
457 * @param refreshRate 0.01
458 * @param speed 5.0
459 * @param angle 90.0
460 * @param stopWhileStanding false Character stops if no key is pressed.
461 */
462 public static method init takes real refreshRate, real speed, real angle, boolean stopWhileStanding returns nothing
463 //static start members
464 set thistype.refreshRate = refreshRate
465 set thistype.speed = speed
466 set thistype.angle = angle
467 set thistype.stopWhileStanding = stopWhileStanding
468 endmethod
469 else
470 /**
471 * @param fpsKeyMoveForward 87 - W
472 * @param fpsKeyMoveBackward 83 - S
473 * @param fpsKeyTurnRight 68 - D
474 * @param fpsKeyTurnLeft 65 - A
475 * @param refreshRate 0.01
476 * @param speed 5.0
477 * @param angle 90.0
478 * @param stopWhileStanding false Character stops if no key is pressed.
479 */
480 public static method init takes integer fpsKeyMoveForward, integer fpsKeyMoveBackward, integer fpsKeyTurnRight, integer fpsKeyTurnLeft, real refreshRate, real speed, real angle, boolean stopWhileStanding returns nothing
481 //static start members
482 set thistype.fpsKeyMoveForward = fpsKeyMoveForward
483 set thistype.fpsKeyMoveBackward = fpsKeyMoveBackward
484 set thistype.fpsKeyTurnRight = fpsKeyTurnRight
485 set thistype.fpsKeyTurnLeft = fpsKeyTurnLeft
486 set thistype.refreshRate = refreshRate
487 set thistype.speed = speed
488 set thistype.angle = angle
489 set thistype.stopWhileStanding = stopWhileStanding
490 endmethod
491 endif
492 endstruct
493
494 endlibrary